﻿namespace DesignModeConsole.行为型.访问者模式;

/// <summary>
/// 访问者服务
/// </summary>
public class VisitorService : IService
{
    public void Main()
    {
        Console.WriteLine("示例一");
        // 只对这些文件进行提取文本操作
        // 违反开闭原则，每次增加功能都要修改所有的类，业务逻辑都在一个类中
        var resourceFiles = new List<ResourceFile>();
        resourceFiles.Add(new PdfFile("a.pdf"));
        resourceFiles.Add(new WordFile("b.word"));
        resourceFiles.Add(new PptFile("c.ppt"));

        foreach (var item in resourceFiles)
        {
            item.Extract2Txt();
        }

        Console.WriteLine("示例2");
        // 将业务操作和具体的数据结构解耦，设计成单独的类
        //  违反开闭原则，增加功能了需要修改每个资源类
        var extractor = new Extractor();
        var compress = new CompressorService();
        var resourceFiles2 = new List<ResourceFile2>();
        resourceFiles2.Add(new PdfFile2("a.pdf"));
        resourceFiles2.Add(new WordFile2("b.word"));
        resourceFiles2.Add(new PptFile2("c.ppt"));
        foreach (var item in resourceFiles2)
        {
            // 提取文本
            item.Accept(extractor);
            // 压缩
            item.Accept(compress);
        }

        Console.WriteLine("示例3");
        // 将方法抽离出来接口，然后后续增加功能就可以不修改资源类
        var extractor2 = new Extractor2();
        var compress2 = new CompressorService2();
        var resourceFiles3 = new List<ResourceFile3>();
        resourceFiles3.Add(new PdfFile3("a.pdf"));
        resourceFiles3.Add(new WordFile3("b.word"));
        resourceFiles3.Add(new PptFile3("c.ppt"));
        foreach (var item in resourceFiles3)
        {
            // 提取文本
            item.Accept(extractor2);
            // 压缩
            item.Accept(compress2);
        }
    }
}